#include <REGX52.H>

sbit LCD_RW=P2^5; //读/写选择			1：读，0：写
sbit LCD_RS=P2^6; //数据/指令选择	1：数据，0：指令	
sbit LCD_EN=P2^7; //使能
#define LCD_DataPort  P0  //宏定义用LCD_DataPort替换P0

void Delay(void)	//@11.0592MHz  1ms
{
	unsigned char data i, j;
	i = 2;
	j = 199;
	do
	{
		while (--j);
	} while (--i);
}

/**
  * @brief  写入指令
  * @param  Command 要写入的指令
  * @retval 无
  */
void LCD_WriteCommand(unsigned char Command)
{
	LCD_RS = 0;
	LCD_RW = 0;
	LCD_DataPort = Command;
	LCD_EN = 1;
	Delay();
	LCD_EN = 0;
	Delay();
}

/**
  * @brief  写入数据
  * @param  Data 要写入的数据
  * @retval 无
  */
void LCD_WriteData(unsigned char Data)
{
	LCD_RS = 1;
	LCD_RW = 0;
	LCD_DataPort = Data;
	LCD_EN = 1;
	Delay();
	LCD_EN = 0;
	Delay();
}

/**
  * @brief  LCD1602初始化
  * @param  无
  * @retval 无
  */
void LCD_Init()
{
	LCD_WriteCommand(0x06);//3-数据读写·1操作后，光标自动加一，画面不动
	LCD_WriteCommand(0x0C);//4-显示开，光标关，闪烁关
	LCD_WriteCommand(0x38);//6-八位数据接口，两行显示，5*7点阵
	LCD_WriteCommand(0x01);//1-清屏
}

/**
  * @brief  确定光标位置
  * @param  Line 行 范围：1~2 | Column 列 范围：1~16 
  * @retval 无
  */
void LCD_SetCursor(unsigned char Line,Column)
{
	if(Line==1)
	{
		LCD_WriteCommand(0x80|(Column-1));
	}
	if(Line==2)
	{
		LCD_WriteCommand(0xC0|(Column-1)+0x40);		
	}	
}

/**
  * @brief  显示一个字符
  * @param  Line 行 范围：1~2 | Column 列 范围：1~16 
  * @param  Char 要显示的字符
  * @retval 
  */
void LCD_ShowChar(unsigned char Line,Column,Char)
{
	LCD_SetCursor(Line,Column);
	LCD_WriteData(Char);
}	

/**
  * @brief  显示一个字符串
  * @param  Line 行 范围：1~2 | Column 列 范围：1~16 
  * @param  String 要显示的字符串
  * @retval 无  （想要传递数组得用到数组指针）
  */
void LCD_ShowString(unsigned char Line,Column,unsigned char *String)
{
	unsigned char i;
	LCD_SetCursor(Line,Column);
	for(i=0;String[i]!=0;i++)
	{
		LCD_WriteData(String[i]);			
	}
}	

/**
  * @brief  表示数X的y次方
  * @param  x 底数  |  y 指数
  * @retval 返回要求的X^y
  */
int LCD_Pow(int x,int y)
{
	unsigned char i;
	int Result=1;
	for(i=0;i<y;i++)
	{Result *= x;}
	return Result;
}

/**
  * @brief  显示一个数字
  * @param  Line 行 范围：1~2 | Column 列 范围：1~16 
  * @param  Number 要输入的数 | Length 要显示的长度 
  * @retval 无
  */
void LCD_ShowNum(unsigned char Line,Column,unsigned int Number,unsigned char Length)
{
	unsigned char i;
	LCD_SetCursor(Line,Column);
	for(i=Length;i>0;i--)
	{
/*以66为例显示两位
	第一位要显示： 66/10%10 -> 6(int)  在将‘0’的编码值加上6即为6的编码
*/		
		LCD_WriteData('0'+Number/LCD_Pow(10,i-1)%10);
	}
}	

/**
  * @brief  显示一个有符号数字
  * @param  Line 行 范围：1~2 | Column 列 范围：1~16 
  * @param  Number 要输入的数 | Length 要显示的长度 
  * @retval 无
  */
void LCD_ShowSignedNum(unsigned char Line,Column,int Number,unsigned char Length)
{
	unsigned char i;
	unsigned int Number1;
	LCD_SetCursor(Line,Column);
	if(Number<0)
	{
		LCD_WriteData('-');
		Number1 = -Number;
	}
	else
	{
		LCD_WriteData('+');
		Number1 = Number;	
	}
	for(i=Length;i>0;i--)
	{	
		LCD_WriteData('0'+Number1/LCD_Pow(10,i-1)%10);
	}
}	

/**
  * @brief  显示一个16进制数字
  * @param  Line 行 范围：1~2 | Column 列 范围：1~16 
  * @param  Number 要输入的数 | Length 要显示的长度 
  * @retval 无
  */
void LCD_ShowHexNum(unsigned char Line,Column,int Number,unsigned char Length)
{
	unsigned char i,HexNumber;
	LCD_SetCursor(Line,Column);
	for(i=Length;i>0;i--)
	{
		HexNumber = Number/LCD_Pow(16,i-1)%16;
		if(HexNumber<10)
		{
		  LCD_WriteData('0'+HexNumber);			
		}
		else
		{
			LCD_WriteData('A'+HexNumber-10);	
		}
	}		
}

/**
  * @brief  显示一个2进制数字
  * @param  Line 行 范围：1~2 | Column 列 范围：1~16 
  * @param  Number 要输入的数 | Length 要显示的长度 
  * @retval 无
  */
void LCD_ShowBinNum(unsigned char Line,Column,int Number,unsigned char Length)
{
	unsigned char i;
	LCD_SetCursor(Line,Column);
	for(i=Length;i>0;i--)
	{	
		LCD_WriteData('0'+Number/LCD_Pow(2,i-1)%2);
	}	
}

